package com.jandan.persistence.iface;

import java.util.Date;
import java.util.List;
import com.jandan.ui.model.LearnedWord;

/**
 * 已学单词的数据库访问接口
 * @author Gong Yong
 * @version 1.0
 * @see com.jandan.persistence.sqlmapdao.LearnedWordSqlMapDao 
 */
public interface LearnedWordDao {
	
	/**
	 * 获取某个已学单词ID对应的已学单词对象
	 * @param learnedWordID 一些单词ID
	 * @return 已学单词
	 */
	LearnedWord getLearnedWordByLearnedWordID(String learnedWordID);

	/**
	 * 向数据库插入某个已学单词
	 * @param learnedWord 已学单词
	 */
	void insertLearnedWord(LearnedWord learnedWord);

	/**
	 * 插入或更新某个已学单词
	 * <p>
	 * 如果此已学单词不在数据库中则将此单词插入到表中，否则更新表中对应的记录
	 * </p>
	 * @param learnedWord
	 */
	void insertOrUpdateLearnedWord(LearnedWord learnedWord);

	/**
	 * 更新已学单词
	 * @param learnedWord 已学单词
	 */
	void updateLearnedWord(LearnedWord learnedWord);

	/**
	 * 删除已学单词
	 * @param learnedWordID 已学单词ID
	 */
	void deleteLearnedWord(String learnedWordID);

	/**
	 * 获取某个课程的所有已学单词
	 * @param lessonID 课程ID
	 * @return 已学单词列表
	 */
	List<LearnedWord> getLearnedWordListByLessonID(long lessonID);

	/**
	 * 获取某个课程的某个小词库的所有一些单词
	 * @param lessonID  课程ID
	 * @param wordLibID 词库ID
	 * @param offset    小词库在整个所学词库中的起始位置
	 * @param limit		小词库的单词总数
	 * @return 已学单词列表
	 */
	List<LearnedWord> getLearnedWordListOfOneSmallLibByLessonID(long lessonID,
			long wordLibID, int offset, int limit);

	
	/**
	 * 获取某个课程的某个小词库的某部分已学单词,<strong>用于分页</strong>
	 * @param lessonID 课程ID
	 * @param wordLibID 词库ID
	 * @param offset  小词库在整个所学词库中的起始位置
	 * @param limit   小词库的单词总数
	 * @param start   要获取的已学单词的起始位置
	 * @param count   要获取的已学单词总数
	 * @return 已学单词列表
	 */
	List<LearnedWord> getLearnedWordListOfOneSmallLibByLessonID(long lessonID,
			long wordLibID, int offset, int limit, int start, int count);

	/**
	 * 获取某个课程的某个小词库的所有已学单词总数
	 * @param lessonID  课程ID
	 * @param wordLibID 词库ID
	 * @param offset    小词库在整个所学词库中的起始位置
	 * @param limit		小词库的单词总数
	 * @return 已学单词总数
	 */
	int getLearnedWordCountOfOneSmallLibByLessonID(long lessonID,
			long wordLibID, int offset, int limit);

	
	/**
	 * 获取某个课程某个特定日期所学的已学单词总数
	 * @param lessonID 课程ID
	 * @param date     单词学习日期
	 * @return 已学单词列表
	 */
	List<LearnedWord> getLearnedWordListByLessonIDAndDate(long lessonID,
			Date date);
	
	/**
	 * 获取某个用户所有生词本上的已学单词，<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param userID
	 * @return
	 */
	List<LearnedWord> getAllLearnedStrangeWordListByUserID(long userID);

	/**
	 * 获取某个用户某部分生词本上的已学单词<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param userID
	 * @param offset
	 * @param limit
	 * @return
	 */
	List<LearnedWord> getLearnedStrangeWordListByUserID(long userID,
			int offset, int limit);

}
